#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/eventfd.h>
#include <stdbool.h>

// 定义任务函数类型
typedef void (*task_func_t)();

// 示例任务函数
void task1() {
    printf("Executing task 1\n");
}

void task2() {
    printf("Executing task 2\n");
}

// 简单的任务队列，使用函数指针数组表示
#define MAX_TASKS 10
task_func_t task_queue[MAX_TASKS];
int task_count = 0;

// 添加任务到队列
void add_task(task_func_t task) {
    if (task_count < MAX_TASKS) {
        task_queue[task_count++] = task;
    } else {
        fprintf(stderr, "Task queue is full\n");
    }
}

// 执行所有任务
void execute_tasks() {
    for (int i = 0; i < task_count; ++i) {
        task_queue[i]();
    }
    task_count = 0; // 假设任务执行完毕后清空队列
}

int main() {
    int efd = eventfd(0, 0); // 创建一个非阻塞的eventfd
    if (efd == -1) {
        perror("eventfd");
        exit(EXIT_FAILURE);
    }

    // 添加任务到队列
    add_task(task1);
    add_task(task2);

    // 模拟事件触发（在这里我们直接写入一个值到eventfd来模拟）
    uint64_t value = 1;
    if (write(efd, &value, sizeof(value)) == -1) {
        perror("write");
        close(efd);
        exit(EXIT_FAILURE);
    }

    // 读取eventfd以确认事件（在实际应用中，这一步可能是在一个事件循环中）
    uint64_t received_value;
    if (read(efd, &received_value, sizeof(received_value)) == -1) {
        perror("read");
        close(efd);
        exit(EXIT_FAILURE);
    }

    // 读取到事件后执行所有任务
    execute_tasks();

    // 关闭eventfd
    close(efd);

    return 0;
}